package com.md.common.utils;

import com.md.common.enums.ByteEnum;
import com.md.common.enums.IntEnum;
import com.md.common.enums.StringEnum;

/**
 * 通过枚举code获取枚举值
 * @author Ice
 * @date 2018/7/25 0025.
 * @see IntEnum
 * @see ByteEnum
 * @see StringEnum
 */
public class EnumUtils {

    /**
     * 通过code值获得枚举
     *
     * @param code
     * @return 不存在在返回空 null
     */
    public static <T extends IntEnum> T getByCode(Class<T> clazz, Integer code) {
        if (code == null)
            return null;
        T[] values = clazz.getEnumConstants();
        for (T e : values) {
            if (e.getCode() == (code))
                return e;
        }
        return null;
    }

    /**
     * 通过code值获得枚举名称
     *
     * @param code
     * @return 不存在在返回空字符串 ""
     */
    public static <T extends IntEnum> String getNameByCode(Class<T> clazz, Integer code) {
        T e = getByCode(clazz, code);
        if (e == null)
            return "";
        return e.getName();
    }

    /**
     * 通过code值获得枚举
     *
     * @param code
     * @return 不存在在返回空 null
     */
    public static <T extends ByteEnum> T getByCode(Class<T> clazz, Byte code) {
        if (code == null)
            return null;
        T[] values = clazz.getEnumConstants();
        for (T e : values) {
            if (e.getCode() == (code))
                return e;
        }
        return null;
    }

    /**
     * 通过code值获得枚举名称
     *
     * @param code
     * @return 不存在在返回空字符串 ""
     */
    public static <T extends ByteEnum> String getNameByCode(Class<T> clazz, Byte code) {
        T e = getByCode(clazz, code);
        if (e == null)
            return "";
        return e.getName();
    }

    /**
     * 通过code值获得枚举
     *
     * @param code
     * @return 不存在在返回空 null
     */
    public static <T extends StringEnum> T getByCode(Class<T> clazz, String code) {
        if (code == null)
            return null;
        T[] values = clazz.getEnumConstants();
        for (T e : values) {
            if (e.getCode() == (code))
                return e;
        }
        return null;
    }

    /**
     * 通过code值获得枚举名称
     *
     * @param code
     * @return 不存在在返回空字符串 ""
     */
    public static <T extends StringEnum> String getNameByCode(Class<T> clazz, String code) {
        T e = getByCode(clazz, code);
        if (e == null)
            return "";
        return e.getName();
    }

}
